<?php defined('SYSPATH') or die('No direct script access.');
/**
 * 支付响应处理
 *
 * @author  Yellow.Chow <aultoale@gmail.com>
 * @version $Id: respond.php 199 2012-05-09 08:32:18Z yellow.chow $
 * @license http://www.gnu.org/licenses/gpl-3.0.html    GPL 3
 */
abstract class Payment_Respond implements IteratorAggregate
{

    /**
     * 经过分析后的结果集
     *
     * @var array
     */
    protected $_result = array();

    /**
     * 商家密钥
     *
     * @var string
     */
    protected $_key = NULL;

    /**
     * 分析返回的结果
     *
     * @param  array  $params
     * @return array
     */
    public function parse(array $params)
    {
        foreach ($params as $key => $value)
        {
            $this->_result[$key] = $value;
        }

        if ( ! empty($this->_result))
        {
            $this->_verify();
        }

        return $this;
    }

    /**
     * 获取指定的值
     *
     * @param  string  $name
     * @param  minxed  $default
     * @return mixed
     */
    public function get($name, $default = NULL)
    {
        return isset($this->_result[$name]) ? $this->_result[$name] : $default;
    }

    /**
     * 获取所有结果
     *
     * @return array
     */
    public function get_all()
    {
        return $this->_result;
    }

    /**
     * 返回给 foreach 调用的接口
     *
     * @return ArrayObject
     */
    public function getIterator()
    {
        return new ArrayObject($this->get_all());
    }

    /**
     * 设置商家密钥
     *
     * @param  string  $key
     */
    public function set_key($key)
    {
        $this->_key = (string) $key;

        return $this;
    }

    /**
     * 获取订单号
     *
     * @return string
     */
    abstract public function get_id();

    /**
     * 获取支付交易号
     *
     * @return string
     */
    abstract public function get_payment_no();

    /**
     * 获取数据签名
     *
     * @return string
     */
    abstract public function get_sign();

    /**
     * 获取订单总金额
     *
     * @return float
     */
    abstract public function get_amount();

    /**
     * 获取付款时间
     *
     * @return int
     */
    abstract public function get_time();

    /**
     * 获取支付状态
     *
     * 0 - 初始状态，未付款
     * 1 - 买家已付款
     * 2 - 支付超时
     * 3 - 支付成功 (完成)
     * 4 - 支付失败 (完成)
     *
     * @return int
     */
    abstract public function get_status();

    /**
     * 验证数字签名
     *
     */
    abstract protected function _verify();

    /**
     * 是否等待付款中
     *
     * @return bool
     */
    public function is_waitpay()
    {
        return ($this->get_status() === Payment::STAT_CONFIRMED);
    }

    /**
     * 买家是否已经付款
     *
     * @return bool
     */
    public function is_paid()
    {
        return ($this->get_status() === Payment::STAT_PAID);
    }

    /**
     * 是否已发货
     *
     * @return bool
     */
    public function is_shipped()
    {
        return ($this->get_status() === Payment::STAT_SHIPPED);
    }

    /**
     * 是否已收货
     *
     * @return bool
     */
    public function is_received()
    {
        return ($this->get_status() === Payment::STAT_RECEIVED);
    }

    /**
     * 订单是否已完成
     *
     * @return bool
     */
    public function is_succeed()
    {
        return ($this->get_status() === Payment::STAT_SUCCEED);
    }

    /**
     * 订单是否失败
     *
     * @return bool
     */
    public function is_failed()
    {
        return ($this->get_status() === Payment::STAT_FAILED OR $this->get_status() === Payment::STAT_TIMEOUT);
    }

    /**
     * 订单是否超时
     *
     * @return bool
     */
    public function is_timeout()
    {
        return ($this->get_status() === Payment::STAT_TIMEOUT);
    }

}